perm filename PAT[1,DBL] blob sn#055709 filedate 1973-08-01 generic text, type T, neo UTF8
(FILECREATED "31-JUL-73 14:47:02" PAT)


(DEFINEQ

(OUTTUPLE
  [LAMBDA (L)
    (COND
      ((ATOM L)
        L)
      ((EQUAL (CAR L)
              (QUOTE TUPLE))
        (OUTTUPLE (CDR L)))
      (T (CONS (OUTTUPLE (CAR L))
               (OUTTUPLE (CDR L])

(FLATTEN
  [LAMBDA (L)
    (COND
      ((NULL L)
        NIL)
      ((ATOM L)
        (LIST L))
      (T (APPEND (FLATTEN (CAR L))
                 (FLATTEN (CDR L])

(SMATCHQ
  [QLAMBDA
    (TUPLE ←B
           ←A)
    (QATTEMPT
      (QMATCHQ $B $A)
      ELSE
       (IF
         (MEMBER (CAR (OUTTUPLE (FLATTEN $B)))
                 (QUOTE (FOR UNTIL CONS WHILE INSTRUCTIONS
                           DO IF SETQ QMATCHQ)))
           THEN
            (AND
              (PRINT (QUOTE (A COMPLEX MATCH IS REQUIRED)))
              (PRINT (QUOTE (THE ARGUMENTS B AND A ARE)))
              (PRINT $B)
              (PRINT $A)
              (FOR
                X IN $A AS Y IN $B
                 COLLECT
                  (AND
                    (PRINT (QUOTE (X AND Y ARE)))
                    (PRINT X)
                    (PRINT Y)
                    (SETQ NN (LENGTH X))
                    (QMATCHQ ←N
                             (EVAL NN))
                    (PRINT (QUOTE N))
                    (PRINT ?N)
                    (SETQ Y (EVAL Y))
                    (PRINT (QUOTE (WE EVAL Y AND GET)))
                    (PRINT Y)
                    (QMATCHQ ←YY
                             (TUPLE (EVAL Y)))
                    (PRINT (QUOTE (YY IS)))
                    (PRINT $YY)
                    (IF
                      (EQUAL (CAAR $YY)
                             (QUOTE MULTIPLE))
                        THEN
                         (QPROG
                           (DIDIT)
                           (PRINT (QUOTE (WE HAVE A MULTIPLE (
                                               NONDETERMINISTIC)
                                             MATCH)))
                           [FOR
                             Z IN (CDAR $YY)
                              DO
                               (AND
                                 (PRINT (QUOTE (Z IS)))
                                 (PRINT Z)
                                 (IF
                                   (EQUAL X Z)
                                     THEN
                                      [AND
                                        (SETQ DIDIT T)
                                        (RETURN
                                          (QMATCHQ ←YY
                                                   (TUPLE (EVAL Z]
                                   ELSE (PRINT (QUOTE (SORRY THIS DIDNT 
                                                             MATCH X]
                           (IF DIDIT
                               THEN (RETURN T))
                           (PRINT (QUOTE (SORRY NO Z MATCHED X)))
                           (PRINT X)
                           (RETURN (QFAIL)))
                      ELSE T)
                    (QMATCHQ $YY (TUPLE (EVAL X)))
                    (SETQ ARGS (CONS $YY ARGS))
                    (PRINT (QUOTE (THE MATCH SUCCEEDED FOR THIS 
                                                           ARGUMENT)))
                    $YY)))
         ELSE (AND (PRINT (QUOTE (APPARENTLY A SIMPLE MATCH WHICH 
                                             FAILED)))
                   (QFAIL])

(INITIALIZE
  [QLAMBDA
    ←ANY
    (SETQ TUPLE (QUOTE TUPLE))
    [QMATCHQ
      ←FF
      (TUPLE (TUPLE FOR QQ IN (TUPLE QUOTE (TUPLE 2 5 1))
                COLLECT (TUPLE ADD1 (TUPLE TIMES 3 QQ)))
             (TUPLE FOR II FROM 1 UNTIL (TUPLE II GT ?N)
                COLLECT (TUPLE TIMES II 2))
             (TUPLE CONS (TUPLE QUOTE MULTIPLE)
                    (TUPLE FOR JJ FROM 1
                       UNTIL (TUPLE (TUPLE TIMES 3 JJ)
                                    GT ?N)
                       COLLECT
                        (TUPLE FLATTEN
                               (TUPLE LIST (QUOTE TUPLE)
                                      (TUPLE TIMES 2 JJ)
                                      (TUPLE ADD1
                                             (TUPLE TIMES 2 JJ))
                                      (TUPLE QUOTE X)
                                      (TUPLE FOR KK FROM JJ
                                         UNTIL (TUPLE KK GT
                                                      (TUPLE TIMES 2 JJ)
                                                      )
                                         COLLECT (TUPLE LIST
                                                        (TUPLE PLUS KK 
                                                               5)
                                                        (TUPLE PLUS KK 
                                                               6)
                                                        (TUPLE QUOTE X]
    (QMATCHQ ←GG
             (TUPLE (TUPLE 7 16 4)
                    (TUPLE 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30)
                    (TUPLE 4 5 X 7 8 X 8 9 X 9 10 X)))
    (PRINT (QUOTE (END OF INITIALIZATION PROCESS])
)
  (LISPXPRINT (QUOTE PATFNS)
              T)
  (RPAQQ PATFNS (OUTTUPLE FLATTEN SMATCHQ INITIALIZE))
  (LISPXPRINT (QUOTE PATVARS)
              T)
  [RPAQQ PATVARS (ARGS $EE $CC $BB (P (QSETUP PATVARS))
                       (P (INITIALIZE)
                          (PRINT (QUOTE (WE ARE READY]
  (RPAQQ ARGS NIL)
  (RPAQQ $EE NIL)
  (RPAQQ $CC NIL)
  (RPAQQ $BB NIL)
  (QSETUP PATVARS)
  (INITIALIZE)
  (PRINT (QUOTE (WE ARE READY)))
STOP